package controlador;

import java.util.Date;
import java.util.Vector;

import modelo.Linea;
import modelo.LineaAdicional;
import modelo.LineaAdicionalView;
import modelo.LineaView;
import modelo.Plan;
import modelo.Usuario;
import modelo.UsuarioView;

public class TelefoniaMovil {

	private int cantidadMaxLineaAdicional = 5;
	private Vector<Linea> lineasPrincipales;
	private Vector<LineaAdicional> lineasAdicionales;
	private Vector<Usuario> usuarios;
	private Vector<Plan> planes;
	
	public TelefoniaMovil() {
		lineasPrincipales = new Vector<Linea>();
		lineasAdicionales = new Vector<LineaAdicional>();
		usuarios = new Vector<Usuario>();
		planes = new Vector<Plan>();
	}

	private Usuario buscarUsuario(int dni){
		
		for(int i=0; i<usuarios.size();i++){
			if (usuarios.elementAt(i).getDni() == dni &&  (usuarios.elementAt(i).isBorrado() == false))
				return usuarios.elementAt(i);
		}
		return null;
	}

	public boolean existeUsuario(int dni){
		
		for(int i=0; i<usuarios.size();i++){
			if (usuarios.elementAt(i).getDni() == dni && (usuarios.elementAt(i).isBorrado() == false))
				return true;
		}
		return false;
	}
	
	public boolean existePlan(int nroPlan){
		
		for(int i=0; i<planes.size();i++){
			if (planes.elementAt(i).getNroPlan() == nroPlan)
				return true;
		}
		return false;
	}
	

//Metodo para la creacion de usario	
	public boolean crearUsuario(int dni,String nombre, String apellido, String domicilio, int telefono){
		
		Usuario usuario = buscarUsuario(dni);
		
		if (usuario == null){
			usuarios.add(new Usuario(dni, nombre, apellido, domicilio, telefono, false));
			return true;
		}
		
		return false;
	}
	
	//Metodo para la modificar datos del usuario
	public boolean modificarUsuario(int dni, String nombre, String apellido,String domicilio, int telefono) {
		Usuario user = buscarUsuario(dni);
		
		if (user!=null){
			user.setApellido(apellido);
			user.setDomicilio(domicilio);
			user.setNombre(nombre);
			user.setTelefono(telefono);
			return true;
			
		}else
			return false;
	}
	
	private void borrarLineaPorUsuario (int dni){
		
		for (int i=0;i<lineasPrincipales.size();i++){
			if (lineasPrincipales.elementAt(i).getUsuario().getDni() == dni){
				lineasPrincipales.elementAt(i).setBorrado(true);
			}
		}
	}
	
	
	private void borrarLineaAdicionalPorUsuario (int dni){
		
		for (int i=0;i<lineasAdicionales.size();i++){
			if (lineasAdicionales.elementAt(i).getUsuario().getDni() == dni){
				lineasAdicionales.elementAt(i).setBorrado(true);
			}
		}
	}
	
	//Metodo para borrar logicamiente un Usuario
	public boolean borrarUsuario (int dni){
		Usuario user = buscarUsuario(dni);
		
		if (user!=null){
			user.setBorrado(true);
			borrarLineaPorUsuario(dni);
			borrarLineaAdicionalPorUsuario(dni);
			return true;
			
		}else
			return false;
	}

	
	//Obtiene la vista de todos los usuarios borrados logicamente
	public Vector <UsuarioView> obtenerUsuarioBorrado(){
		Vector<UsuarioView> vecUsuarioView = new Vector<UsuarioView>(); 
		
		
		for (int i =0 ; i<usuarios.size();i++){
			if (usuarios.elementAt(i).isBorrado()== true)
			vecUsuarioView.add(usuarios.elementAt(i).obtenerUsuarioView());
		}
		return vecUsuarioView;
	}
	
//Obtiene la vista de todos los usuarios NO borrados logicamente	
	public Vector <UsuarioView> obtenerUsuario(){
		Vector<UsuarioView> vecUsuarioView = new Vector<UsuarioView>(); 
		
		for (int i =0 ; i<usuarios.size();i++){
		if (usuarios.elementAt(i).isBorrado()== false)
			vecUsuarioView.add(usuarios.elementAt(i).obtenerUsuarioView());
		
		}
		
		return vecUsuarioView;
		
	}
	
// Obtiene la vista de todas las lineas Principales	
	public Vector <LineaView> obtenerLineaPincipal(){
		Vector<LineaView> vecLineaView = new Vector<LineaView>(); 
	
		for (int i =0 ; i<lineasPrincipales.size();i++){
		if (lineasPrincipales.elementAt(i).isBorrado()== false)
			vecLineaView.add(lineasPrincipales.elementAt(i).obtenerViewLinea());
		
		}
		
		return vecLineaView;
		
	}
	
	
//	Obtiene la vista de todas las lineas Adicionales
	public Vector <LineaAdicionalView> obtenerLineaAdicional(){
		Vector<LineaAdicionalView> vecLineaAdicionalView = new Vector<LineaAdicionalView >(); 
	
		for (int i =0 ; i<lineasAdicionales.size();i++){
		if (lineasAdicionales.elementAt(i).isBorrado()== false)
			vecLineaAdicionalView.add(lineasAdicionales.elementAt(i).obtenerViewLineaAdicional());
		
		}
		
		return vecLineaAdicionalView;
		
	}
	
	
	//TODO SACAR
	public void test (Plan plan){
		planes.add(plan);
	}
	
	private Plan buscarPlan(int nroPlan){
		
		for(int i=0; i<planes.size();i++){
			if (planes.elementAt(i).getNroPlan() == nroPlan )
				return planes.elementAt(i);
		}
		return null;
	}
	
	
	//Metodo para la creacion de Linea Principal
	public int crearLineaPrincipal(int dni, int nroPlan){
		Date fechaContrato;
		Linea linea;
		Usuario usuario;
		Plan plan;
	
		usuario = buscarUsuario (dni);
		
				
		if (usuario != null && usuario.tieneLineaPrincipal() == false){  
			plan = buscarPlan(nroPlan);
			fechaContrato = new Date();
			linea = new Linea(usuario,fechaContrato,plan ,false); 
			lineasPrincipales.add(linea);
			usuario.agregarLineaPrincipal(linea);
			return linea.getNumero();
		}else
			
		return 0;
	}
	
	//Metodo para la creacion de Liena Adicional
	//TODO falta PLAN
	public int crearLineaAdicional(int dni, String nombreAdicional, int nroPlan){
		Date fechaContrato;
		LineaAdicional linea;
		Usuario usuario;
		Plan plan;
	
		usuario = buscarUsuario (dni);
		int cantidadLineasAdicionales = usuario.cantidadLineaAdicional();
		
		if (usuario!=null && cantidadLineasAdicionales < cantidadMaxLineaAdicional
				&& usuario.tieneLineaPrincipal()== true){
				fechaContrato = new Date();
				plan = buscarPlan(nroPlan);
				linea = new LineaAdicional(usuario,fechaContrato,nombreAdicional,plan, false); 
				lineasAdicionales.add(linea);
				usuario.agregarLineaAdicional(linea);
			return linea.getNumero();		
		}else
			
			return 0;
	}

	
}

	
